Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / scripts / repack-android-pycodec2-wheels.py

Displaying Raw • Download


scripts/repack-android-pycodec2-wheels.py legacy/win7 (159b2358) Text, 5.00 KB

T8b949e#!/usr/bin/env python3
T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Bundle libcodec2.so into Chaquopy pycodec2 wheels (Android vendor dir)."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787argparse
Tff7b72import T7ee787base64
Tff7b72import T7ee787hashlib
Tff7b72import T7ee787re
Tff7b72import T7ee787shutil
Tff7b72import T7ee787sys
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787zipfile
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path


Tff7b72def Td2a8ff_abi_tag_from_wheel_nameTb4b4b4(Te6edf3nameTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3match Tff7b72= Te6edf3reTff7b72.Td2a8ffsearchTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ffandroid_Ta5d6ff\Ta5d6ffd+_(arm64_v8a|armeabi_v7a|x86_64)Ta5d6ff"Tb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72return Te6edf3matchTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72if Te6edf3match Tff7b72else Tff7b72None


Tff7b72def Td2a8ff_extract_libcodec2Tb4b4b4(Te6edf3lib_wheelTb4b4b4: Te6edf3PathTb4b4b4, Te6edf3dest_dirTb4b4b4: Te6edf3PathTb4b4b4) Tff7b72-Tff7b72> Te6edf3Path Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3lib_wheelTb4b4b4) Tff7b72as Te6edf3zfTb4b4b4:
Tff7b72for Te6edf3name Tff7b72in Te6edf3zfTff7b72.Td2a8ffnamelistTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3nameTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ffchaquopy/lib/libcodec2.soTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3zfTff7b72.Td2a8ffextractTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3dest_dirTb4b4b4)
Tff7b72return Te6edf3dest_dir Tff7b72/ Te6edf3name
Tff7b72return Tff7b72None


Tff7b72def Td2a8ff_find_libcodec2Tb4b4b4(Te6edf3vendor_dirTb4b4b4: Te6edf3PathTb4b4b4, Te6edf3abi_tagTb4b4b4: Tffa657strTb4b4b4, Te6edf3dest_dirTb4b4b4: Te6edf3PathTb4b4b4) Tff7b72-Tff7b72> Te6edf3Path Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3matches Tff7b72= Tffa657sortedTb4b4b4(Te6edf3vendor_dirTff7b72.Td2a8ffglobTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffchaquopy_libcodec2-*-android_*_Tffd700{Te6edf3abi_tagTffd700}Ta5d6ff.whlTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3matchesTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3_extract_libcodec2Tb4b4b4(Te6edf3matchesTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3dest_dirTb4b4b4)


Tff7b72def Td2a8ff_urlsafe_sha256_digestTb4b4b4(Te6edf3dataTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Tb4b4b4(
Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3hashlibTff7b72.Td2a8ffsha256Tb4b4b4(Te6edf3dataTb4b4b4)Tff7b72.Td2a8ffdigestTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)
Tff7b72.Td2a8ffrstripTb4b4b4(Ta5d6ff"Ta5d6ff=Ta5d6ff"Tb4b4b4)
Tb4b4b4)


Tff7b72def Td2a8ff_rewrite_wheel_recordTb4b4b4(Te6edf3rootTb4b4b4: Te6edf3PathTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Regenerate dist-info/RECORD after wheel contents change.

Chaquopy's pip post-processor parses RECORD sizes with ``int()`` and rejects
directory placeholder lines (``path,,``). Rebuilding RECORD from file bytes
keeps repacked pycodec2 wheels installable.
"""
Te6edf3dist_infos Tff7b72= Tffa657sortedTb4b4b4(Te6edf3rootTff7b72.Td2a8ffglobTb4b4b4(Ta5d6ff"Ta5d6ff*.dist-infoTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3dist_infosTb4b4b4:
Tff7b72return

Te6edf3record_path Tff7b72= Te6edf3dist_infosTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72/ Ta5d6ff"Ta5d6ffRECORDTa5d6ff"
Tff7b72if Tff7b72not Te6edf3record_pathTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return

Te6edf3record_rel Tff7b72= Te6edf3record_pathTff7b72.Td2a8ffrelative_toTb4b4b4(Te6edf3rootTb4b4b4)Tff7b72.Td2a8ffas_posixTb4b4b4(Tb4b4b4)
Te6edf3file_entriesTb4b4b4: Tffa657listTb4b4b4[Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657bytesTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3path Tff7b72in Tffa657sortedTb4b4b4(Te6edf3rootTff7b72.Td2a8ffrglobTb4b4b4(Ta5d6ff"Ta5d6ff*Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3pathTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3rel Tff7b72= Te6edf3pathTff7b72.Td2a8ffrelative_toTb4b4b4(Te6edf3rootTb4b4b4)Tff7b72.Td2a8ffas_posixTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rel Tff7b72== Te6edf3record_relTb4b4b4:
Tff7b72continue
Te6edf3file_entriesTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3relTb4b4b4, Te6edf3pathTff7b72.Td2a8ffread_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)

Te6edf3rows Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3relTb4b4b4, Te6edf3data Tff7b72in Te6edf3file_entriesTb4b4b4:
Te6edf3digest Tff7b72= Te6edf3_urlsafe_sha256_digestTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3rowsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3relTffd700}Ta5d6ff,sha256=Tffd700{Te6edf3digestTffd700}Ta5d6ff,Tffd700{Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)

Te6edf3record_body Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rowsTb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"
Te6edf3record_digest Tff7b72= Te6edf3_urlsafe_sha256_digestTb4b4b4(Te6edf3record_bodyTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3record_body Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3record_relTffd700}Ta5d6ff,sha256=Tffd700{Te6edf3record_digestTffd700}Ta5d6ff,Tffd700{Tffa657lenTb4b4b4(Te6edf3record_bodyTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)Tffd700}Tffea00\nTa5d6ff"
Te6edf3record_pathTff7b72.Td2a8ffwrite_bytesTb4b4b4(Te6edf3record_bodyTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)


Tff7b72def Td2a8ffrepack_pycodec2_wheelTb4b4b4(Te6edf3pycodec2_wheelTb4b4b4: Te6edf3PathTb4b4b4, Te6edf3libcodec2_soTb4b4b4: Te6edf3PathTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Tff7b72not Te6edf3libcodec2_soTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffMissing libcodec2.so for Tffd700{Te6edf3pycodec2_wheelTff7b72.Td2a8ffnameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72return Tff7b72False

Tff7b72with Te6edf3tempfileTff7b72.Td2a8ffTemporaryDirectoryTb4b4b4(Te6edf3prefixTff7b72=Ta5d6ff"Ta5d6ffrepack-pycodec2-Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3tmp_dirTb4b4b4:
Te6edf3root Tff7b72= Te6edf3PathTb4b4b4(Te6edf3tmp_dirTb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3pycodec2_wheelTb4b4b4) Tff7b72as Te6edf3zinTb4b4b4:
Te6edf3zinTff7b72.Td2a8ffextractallTb4b4b4(Te6edf3rootTb4b4b4)

Te6edf3target Tff7b72= Te6edf3root Tff7b72/ Ta5d6ff"Ta5d6ffpycodec2Ta5d6ff" Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"
Te6edf3targetTff7b72.Td2a8ffparentTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3shutilTff7b72.Td2a8ffcopy2Tb4b4b4(Te6edf3libcodec2_soTb4b4b4, Te6edf3targetTb4b4b4)
Te6edf3_rewrite_wheel_recordTb4b4b4(Te6edf3rootTb4b4b4)

Te6edf3tmp_wheel Tff7b72= Te6edf3pycodec2_wheelTff7b72.Td2a8ffwith_suffixTb4b4b4(Ta5d6ff"Ta5d6ff.repack.whlTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(
Te6edf3tmp_wheelTb4b4b4,
Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4,
Te6edf3compressionTff7b72=Te6edf3zipfileTff7b72.Td2a8ffZIP_DEFLATEDTb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3zoutTb4b4b4:
Tff7b72for Te6edf3path Tff7b72in Tffa657sortedTb4b4b4(Te6edf3rootTff7b72.Td2a8ffrglobTb4b4b4(Ta5d6ff"Ta5d6ff*Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3pathTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3zoutTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3pathTff7b72.Td2a8ffrelative_toTb4b4b4(Te6edf3rootTb4b4b4)Tff7b72.Td2a8ffas_posixTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3tmp_wheelTff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3pycodec2_wheelTb4b4b4)
Tff7b72return Tff7b72True


Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Tff7b72__doc__Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff--vendor-dirTa5d6ff"Tb4b4b4,
Tffa657typeTff7b72=Te6edf3PathTb4b4b4,
Te6edf3defaultTff7b72=Te6edf3PathTb4b4b4(Ta5d6ff"Ta5d6ffandroid/vendorTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffDirectory containing pycodec2 and chaquopy_libcodec2 wheelsTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Te6edf3vendor_dir Tff7b72= Te6edf3argsTff7b72.Td2a8ffvendor_dirTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3vendor_dirTff7b72.Td2a8ffis_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffVendor directory not found: Tffd700{Te6edf3vendor_dirTffd700}Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72return T79c0ff1

Te6edf3wheels Tff7b72= Tffa657sortedTb4b4b4(Te6edf3vendor_dirTff7b72.Td2a8ffglobTb4b4b4(Ta5d6ff"Ta5d6ffpycodec2-*-android_*.whlTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3wheelsTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo pycodec2 Android wheels under Tffd700{Te6edf3vendor_dirTffd700}Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72return T79c0ff1

Te6edf3ok Tff7b72= Tff7b72True
Tff7b72for Te6edf3wheel Tff7b72in Te6edf3wheelsTb4b4b4:
Te6edf3abi_tag Tff7b72= Te6edf3_abi_tag_from_wheel_nameTb4b4b4(Te6edf3wheelTff7b72.Td2a8ffnameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3abi_tagTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSkipping unrecognized wheel name: Tffd700{Te6edf3wheelTff7b72.Td2a8ffnameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Te6edf3ok Tff7b72= Tff7b72False
Tff7b72continue
Tff7b72with Te6edf3tempfileTff7b72.Td2a8ffTemporaryDirectoryTb4b4b4(Te6edf3prefixTff7b72=Ta5d6ff"Ta5d6fflibcodec2-src-Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3lib_tmpTb4b4b4:
Te6edf3libcodec2 Tff7b72= Te6edf3_find_libcodec2Tb4b4b4(Te6edf3vendor_dirTb4b4b4, Te6edf3abi_tagTb4b4b4, Te6edf3PathTb4b4b4(Te6edf3lib_tmpTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3libcodec2 Tff7b72is Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo chaquopy_libcodec2 wheel for ABI Tffd700{Te6edf3abi_tagTffd700}Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Te6edf3ok Tff7b72= Tff7b72False
Tff7b72continue
Tff7b72if Tff7b72not Te6edf3repack_pycodec2_wheelTb4b4b4(Te6edf3wheelTb4b4b4, Te6edf3libcodec2Tb4b4b4)Tb4b4b4:
Te6edf3ok Tff7b72= Tff7b72False
Tff7b72continue
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRepacked Tffd700{Te6edf3wheelTff7b72.Td2a8ffnameTffd700}Ta5d6ff with pycodec2/libcodec2.soTa5d6ff"Tb4b4b4)

Tff7b72return T79c0ff0 Tff7b72if Te6edf3ok Tff7b72else T79c0ff1


Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Tff7b72raise Tf85149SystemExitTb4b4b4(Te6edf3mainTb4b4b4(Tb4b4b4)Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────